package com.css.sword.knowing.search;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;

/**
 * 搜索字段属性类，既检索条件： 对搜索条件的定义 field: 字段名，字符串类型 operater:
 * 如果取值为"must"，表示返回的结果必须满足该条件，其他取值表示应当满足。如果所有的搜索条件都是应当的，搜索结果必须至少满足其中一个搜索条件，
 * 如果搜索条件中有必须的，则搜索结果可以满足应当的，也可以不满足 searchValue: 被搜索字段应当满足的取值要求。 method:
 * 搜索的方法，取值包括：phrase,wildcard,range,默认值:phrase valueType:
 * 取值包括string,int,long,float,double,默认值：string operator:
 * 取值包括must,nust_not,should,默认值：must
 */
public class SearchField {
    private String field;
    private String operator;// must,nust_not,should
    private Object searchValue;

	private String nestedPath = "";
	
    private String method;
    private ValueRange valueRanges;
    private String valueType;
    private SearchField[] childrenField;
    private Float boost;
    private boolean isConstantScoreQuery = false;

    /**
     * 获取字段名称
     * 
     * @return 字段名称
     */
    public String getField() {
        return field;
    }

    /**
     * 设置字段名称
     * 
     * @param field
     *            字段名称
     */
    public void setField(String field) {
        this.field = field;
    }

    /**
     * 获取搜索项关系
     * 
     * @return 搜索项关系值
     */
    public String getOperator() {
        return operator;
    }

    /**
     * 设置搜索项关系，取值为：SearchConst中的SEARCH_OPERATOR_MUST，SEARCH_OPERATOR_SHOULD，
     * SEARCH_OPERATOR_MUST_NOT
     * 
     * @param operater
     *            搜索项关系，默认值为：SEARCH_OPERATOR_MUST
     */
    public void setOperator(String operater) {
        this.operator = operater;
    }

    /**
     * 获取搜索项值
     * 
     * @return 搜索项值
     */
    public Object getSearchValue() {
        return searchValue;
    }

    /**
     * 设置搜索项值
     * 
     * @param searchValue
     *            搜索项值，可以是String，Interger，Long，Double，Float
     */
    public void setSearchValue(Object searchValue) {
        this.searchValue = searchValue;
    }
    
    /**
     * 获取nested路径
     * 
     * @return 搜索方式，字符串类型
     */
    public String getNestedPath() {
        return nestedPath;
    }

    /**
     * 设置nested路径
     * 
     * @param nestedPath
     *            nested路径
     */
    public void setNestedPath(String nestedPath) {
        this.nestedPath = nestedPath;
    }

    /**
     * 获取搜索方式
     * 
     * @return 搜索方式，字符串类型
     */
    public String getMethod() {
        return method;
    }

    /**
     * 设置搜索方式，取值为：SearchConst中SEARCH_METHOD_PHRASE，SEARCH_METHOD_MATCH，
     * SEARCH_METHOD_WILDCARD和SEARCH_METHOD_RANGE
     * 
     * @param method
     *            搜索方式，默认为SEARCH_METHOD_PHRASE
     */
    public void setMethod(String method) {
        this.method = method;
    }

    /**
     * 获取范围搜索
     * 
     * @return ValueRange
     */
    public ValueRange getValueRanges() {
        return valueRanges;
    }

    /**
     * 设置范围搜索
     * 
     * @param valueRanges
     *            范围搜索
     */
    public void setValueRanges(ValueRange valueRanges) {
        this.valueRanges = valueRanges;
    }

    /**
     * 获取检索项类型
     * 
     * @return 检索项类型
     */
    public String getValueType() {
        return valueType;
    }

    /**
     * 设置检索项类型，包括string,int,long,float,double
     * 
     * @param valueType
     *            检索项类型
     */
    public void setValueType(String valueType) {
        this.valueType = valueType;
    }

    /**
     * 获取检索项子查询
     * 
     * @return 子查询字段属性，List类型
     */
    public List<SearchField> getChildrenFieldAsList() {
        return Arrays.asList(childrenField);
    }

    /**
     * 设置检索项子查询
     * 
     * @param childrenField
     *            子查询检索字段属性，List类型
     */
    public void setChildrenField(List<SearchField> childrenField) {
        this.childrenField = childrenField.toArray(new SearchField[0]);
    }

    /**
     * 获取检索项子查询
     * 
     * @return 子查询字段属性，SearchField数组
     */
    public SearchField[] getChildrenField() {
        return childrenField;
    }

    /**
     * 设置检索项子查询
     * 
     * @param childrenField
     *            子查询字段属性， SearchField数组
     */
    public void setChildrenField(SearchField[] childrenField) {
        this.childrenField = childrenField;
    }

    /**
     * 获取评分影响因子
     * 
     * @return 评分影响因子
     */
    public Float getBoost() {
        return boost;
    }

    /**
     * 设置评分影响因子，可以提高字段的权重，合理的boost值在1-10之间，也可能15。更高的boost值影响会很小,boost值小于等于0时，
     * 自带的高亮不起作用
     * 
     * @param boost
     *            评分影响因子
     */
    public void setBoost(float boost) {
        this.boost = boost;
    }

    /**
     * 获取非全文字段打分标记
     * 
     * @return 是否打分标记，true：打分， false：不打分
     */
    public boolean isConstantScoreQuery() {
        return isConstantScoreQuery;
    }

    /**
     * 设置非全文字段打分标记，如果检索字段为非全文索引字段，此选项为true时也会打分
     * 
     * @param isConstantScoreQuery
     *            打分标记，true：打分， false：不打分
     */
    public void setConstantScoreQuery(boolean isConstantScoreQuery) {
        this.isConstantScoreQuery = isConstantScoreQuery;
    }
}
